package com.itheima.manager.contrller;

import com.itheima.manager.domain.DitieZhan;
import com.itheima.manager.service.DiTieService;

import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Properties;
import java.util.Scanner;

public class DiTieController {
    //创建扫描类
    private static Scanner sc = new Scanner(System.in);
    //创建一个业务层对象,与持久层打交道
    private static DiTieService service = new DiTieService();


    // 这是项目的启动类, 并展示北京地铁管理系统菜单
    public static void main(String[] args) {
        //1.进入北京地铁管理系统,请先登录
        login();
        while (true) {
            //北京地铁管理系统主菜单
            System.out.println("======================欢迎您来到北京地铁管理系统======================");
            //2.给出选项提示,根据管理人员的选择,执行后续的操作
            System.out.println("请输入您的选择: 1.查看地铁站  2.添加地铁站 3.删除地铁站 4.修改地铁站 5.退出");
            int choice = sc.nextInt();
            switch (choice) {
                case 1:
                    //查看地铁站,显示所有的地铁站信息
                    selectFindAllDt();
                    break;
                case 2:
                    addDiTieZhan();
                    break;
                case 3:
                    deleteDiTieZhan();
                    break;
                case 4:
                    updateDiTieZhan();
                    break;
                case 5:
                    //JVM虚拟机正常停止
                    System.out.println("=============感谢你使用北京地铁管理系统,欢迎您下次再来=============");
                    System.exit(0);
                    break;
                default:
                    System.out.println("您的输入有误,请重新输入...");
            }
        }
    }

    //控制层的修改地铁站信息的方法
    private static void updateDiTieZhan() {
        //调用inputGetId方法,获取一个满足条件的地铁编号
        //true: 是用来查找存在的地铁编号
        String id = inputGetId(true);
        //inputInfoGetDiTie用来输入修改的地铁站信息
        DitieZhan dt = inputInfoGetDiTie(id);
        //调用service的修改方法,修改地铁站信息
        boolean result = service.updateDiTieZhan(id,dt);
        if (result) {
            System.out.println("=================修改成功=================");
        } else {
            System.out.println("=================修改失败=================");
        }
    }

    //删除指定地铁编号的地铁站信息
    private static void deleteDiTieZhan() {
        //调用inputGetId方法,获取一个满足条件的地铁编号
        //true: 是用来查找存在的地铁编号
        String id = inputGetId(true);
        //调用service的删除方法,删除地铁站信息
        boolean result = service.deleteDiTieZhan(id);
        //展示删除的结果
        if (result) {
            System.out.println("=================删除成功=================");
        } else {
            System.out.println("=================删除失败=================");
        }


    }

    //增加一条地铁站信息
    private static void addDiTieZhan() {
        //调用inputGetId方法,获取一个满足条件的地铁编号
        //false: 是用来查找不存在的地铁编号
        String id = inputGetId(false);
        //inputInfoGetDiTie用来输入增加的地铁站信息
        DitieZhan ditie = inputInfoGetDiTie(id);
        //调用业务层的添加方法将地铁站信息添加到文件中去
        boolean result = service.addDiTieZhan(ditie);
        if (result) {
            System.out.println("======================添加成功======================");
        } else {
            System.out.println("======================添加失败======================.");
        }

    }


    //功能:   查看地铁站,显示所有的地铁站信息
    private static void selectFindAllDt() {
        //通过业务层获取文件中的地铁站信息
        ArrayList<DitieZhan> list = service.selectFindAllDt();
        //如果文件为空给出提示
        //不为空输出打印文件中地铁站的信息
        if (list != null) {
            list.stream().filter(dt -> dt != null).forEach(dt -> System.out.println(dt.show()));
        } else {
            System.out.println("目前文件还没有地铁站信息......请您赶快录入吧");
        }

    }

    //给出一个符合要求的地铁编号,录入一个地铁站信息
    private static DitieZhan inputInfoGetDiTie(String id) {
        //1.录入用户输入的地铁站名称
        System.out.println("请输入地铁站名称:");
        String name = sc.next();
        //2.录入用户输入的地铁站所属线路
        System.out.println("请输入所属线路:");
        String line = sc.next();
        //返回一个地铁站对象
        return new DitieZhan(id, name, line);
    }

    //inputGetId方法,获取一个满足条件的地铁编号
    private static String inputGetId(boolean flag) {
        //1.定义一个id变量用来接收符合要求的地铁编号
        String id;
        //2.提示信息
        System.out.println("请输入地铁编号:");
        //3.开启循环,直到获取正确的地铁编号
        while (true) {
            //4.用户录入地铁编号
            id = sc.next();
            //5.判断用户录入的地铁编号是否存在
            boolean isExist = service.isExist(id);
            //5.1isExist与flag进行判断,符合自己的要求,跳出循环
            //5.2不符合要求,给出提示继续查找
            if (flag == isExist) {
                break;
            } else {
                System.out.println("未找到符合您要求的地铁编号请重新输入....");
            }
        }
        return id;
    }


    //这是北京地铁管理系统的登录功能
    private static void login() {
        for (int i = 1; i <= 3; i++) {
            //1.获取密码文件中的账号信息
            //1.1创建Properties集合用来存储账号信息
            Properties prop = new Properties();
            //对受检异常进行处理
            try {
                //1.2创建字符输入流,读取账号文件内容
                FileReader fr = new FileReader("地铁系统案例一\\prop.properties");
                //1.3将字符输入流读取的账号内容存储到集合中去
                prop.load(fr);
            } catch (IOException e) {
                //e.printStackTrace();
                //打印异常出现的位置
                System.out.println("登录功能的文件读取.....出现异常");
            }
            //2.录入用户的登录信息
            //2.1录入用户的登录工号
            System.out.println("=======================请先登录北京地铁管理系统=======================");
            System.out.println("请输入登录的工号:");
            String id = sc.next();
            //2.2录入用户的登录姓名
            System.out.println("请输入的登录的姓名:");
            String name = sc.next();
            //3.对用户登录输入的信息进行验证
            //3.1判断账号是否存在
            //3.2如果存在账号,判断姓名是否相同
            if (prop.size() > 0 && prop.containsKey(id) && name.equals(prop.getProperty(id))) {
                System.out.println("欢迎您登录北京地铁管理系统");
                break;
            } else {
                System.out.println("用户名或密码不正确");
                if (i == 3) {
                    System.out.println("您今天已经没有登陆机会了,请明天再来........");
                } else {
                    System.out.println("您还有" + (3 - i) + "次登录机会");
                }
            }
        }
    }
}
